package com.my.behaviourtype.command;

import java.lang.reflect.InvocationTargetException;

/**
 * 1.命令模式的本质是对命令进行封装，将发出命令的责任和执行命令的责任分割开。
　　2.每一个命令都是一个操作：请求的一方发出请求，要求执行一个操作；接收的一方收到请求，并执行操作。
　　3.命令模式允许请求的一方和接收的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否被执行、何时被执行，以及是怎么被执行的。
　　4.命令模式使请求本身成为一个对象，这个对象和其他对象一样可以被存储和传递。
　　5.命令模式的关键在于引入了抽象命令接口，且发送者针对抽象命令接口编程，只有实现了抽象命令接口的具体命令才能与接收者相关联。
 */
public class Test {

	public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException {
		Receiver receiver = new Receiver();  // 命令接受者
        Invoker invoker = new Invoker();  // 命令调用者
        
        invoker.setCommand(new ConcreteCommand(receiver));  
        invoker.execute();
        
        invoker.setCommand(new AnotherCommand(receiver));  
        invoker.execute();  
        
        Class<Invoker> invokerC = (Class<Invoker>) Class.forName("com.my.behaviourtype.command.Invoker");
        
        Class<ConcreteCommand> commandC = (Class<ConcreteCommand>) Class.forName("com.my.behaviourtype.command.ConcreteCommand");

        Class<Receiver> receiverC = (Class<Receiver>) Class.forName("com.my.behaviourtype.command.Receiver");
        
        Command commandI = commandC.getConstructor(Receiver.class).newInstance(receiverC.newInstance());
        
        Invoker invokerI = ((Invoker)invokerC.newInstance());
        invokerI.setCommand(commandI);
        invokerI.execute();
        
        
        
        
	}

}
